﻿//using BaseUtils;
//using BaseUtils.Logger;
//using BaseUtils.Utils;
//using Service.Com;
//using Service.Com.Model;
//using Service.Com.SQK.Pack;
//using SHMES;
//using System;
//using System.Collections.Generic;
//using System.Net.Sockets;
//using System.Text;
//using System.Threading.Tasks;
//using System.Timers;

//namespace DriveManage.Tightening
//{
//    internal class SocketManager
//    {

//        public static frmMain dd;
//        public static SocketClient _scm = null;
//        System.Timers.Timer keepAliveTM = new System.Timers.Timer();
//        bool manualFlag = false, reConnect = false;
//        string ip;
//        DateTime tightenDT;

//        private string IP = BaseService.AppConfig.tightening.Ip;
//        private int PORT = BaseService.AppConfig.tightening.Port;


//        SocketServer serviceNew;
//        string LastReceiveCommand = null;
//        RateLimiter rateLimiter;
//        private static IPackServie pack;
//        public void InitSocket()
//        {
//            CreateSocketClient();
//            CreateSocketServer();
//        }

//        /// <summary>
//        /// 创建socket客户端，连接拧紧抢
//        /// </summary>
//        private void CreateSocketClient()
//        {
//            rateLimiter = new RateLimiter(TimeSpan.FromMilliseconds(500), TimeSpan.FromMilliseconds(800));

//            keepAliveTM.Interval = 10000;
//            keepAliveTM.Elapsed += keepAlive;
//            keepAliveTM.Start();

//            _scm = new SocketClient(IP, PORT);
//            _scm.OnReceiveMsg += OnReceiveMsg;
//            _scm.OnConnected += OnConnected;
//            _scm.OnFaildConnect += OnFaildConnect;
//            _scm.OnConnectError += OnConnectErr;
//            _scm.Start();
//        }

//        /// <summary>
//        /// 创建本地的socket服务
//        /// </summary>
//        private void CreateSocketServer()
//        {
//            serviceNew = new SocketServer();
//            serviceNew.Start(BaseService.AppConfig.locationSocketService.Port);
//            serviceNew.OnReceiveMsg += OnServerReceiveMsg;
//            serviceNew.OnClientConnected += OnClientConnected;
//            serviceNew.OnConnectError += OnServerConnectError;
//        }

//        private void OnServerConnectError(Socket clientSocket, Exception ex)
//        {
//            //throw new NotImplementedException();
//        }

//        private void OnClientConnected(Socket clientSocket)
//        {
//            //throw new NotImplementedException();
//        }

//        /// <summary>
//        /// 接收客户端消息
//        /// </summary>
//        /// <param name="clientSocket"></param>
//        /// <param name="bytes"></param>
//        private void OnServerReceiveMsg(Socket clientSocket, byte[] bytes)
//        {
//            // string message = Encoding.ASCII.GetString(bytes).Replace("\0", "");
//            string message = Encoding.ASCII.GetString(bytes);
//            if (!string.IsNullOrEmpty(message) && message.Length > 9)
//            {
//                if (message.StartsWith("00230018"))
//                {
//                    LastReceiveCommand = message;
//                    dd.SaveLog($"temp em: {message}", true);
//                }
//                if (message.StartsWith("00200043"))
//                {
//                    //LastReceiveCommandTimer.Dispose();
//                }
//                if (message.StartsWith("00200042"))
//                {
//                    LastReceiveCommand = string.Empty;
//                    dd.SaveLog($"清除缓存使能数据：{LastReceiveCommand}", false);
//                    //TimerDisposed();
//                }
//                if (_scm._isConnected)
//                    _scm.SendMsgZF(bytes);
//            }

//            dd.SaveLog($"服务端已收到: {message}", !message.StartsWith("00209999"));
//            //throw new NotImplementedException();
//        }

//        /// <summary>
//        /// 接收抢的回调，
//        /// 
//        /// 1，正转时正常发送数据给客户端
//        /// 2，反转分自动和手动工位，
//        ///     1，自动工位需要根据反转次数，自动使能，
//        /// </summary>
//        /// <param name="msg"></param>
//        public void OnReceiveMsg(byte[] bytes)
//        {
//            string msg = Encoding.ASCII.GetString(bytes);
//            if (IsTransferSend(msg))
//            {
//                serviceNew?.SendMessage(bytes);
//            }
//            else
//            {
//                ReverseFun(msg);
//            }
//            ResetTransmit();
//            ProcessingResult(msg);
//            UploadDataToMes(msg);
//        }

//        /// <summary>
//        /// 上传数据到MES
//        /// </summary>
//        /// <param name="msg"></param>
//        /// <exception cref="NotImplementedException"></exception>
//        private void UploadDataToMes(string msg)
//        {
//            if (!string.IsNullOrEmpty(msg) && msg.Length > 10 && msg.Substring(4, 4) == "0061")
//            {
//                string StationName = BaseService.AppConfig.field.StationName;
//                Dictionary<string, List<BoltInfo>> Reverses = ReverseService.CheckReverseData(StationName);
//                foreach (var Rev in Reverses)
//                {
//                    StartUploadDataToMes(StationName, Rev);
//                }
//            }
//        }

//        /// <summary>
//        /// 开始上传数据
//        /// </summary>
//        /// <param name="StationName"></param>
//        /// <param name="Rev"></param>
//        private static void StartUploadDataToMes(string StationName, KeyValuePair<string, List<BoltInfo>> Rev)
//        {
//            string SN = Rev.Key;
//            List<BoltInfo> NGS = pack.GetAllNGBoltData(SN, StationName, MesServer.GetPN(SN));

//            List<KeyValuePair<string, string>> MesData = new List<KeyValuePair<string, string>>();

//            for (int i = 0; i <= NGS.Count; i++)
//            {
//                BoltInfo NG = NGS[i];
//                MesData.Add(new KeyValuePair<string, string>(NG.UploadCode + NG.BoltNumber, NG.NJ));
//                MesData.Add(new KeyValuePair<string, string>(NG.UploadCode + "JD" + NG.BoltNumber, NG.JD));

//                if (i < Rev.Value.Count)
//                {
//                    BoltInfo NR = Rev.Value[i];
//                    MesData.Add(new KeyValuePair<string, string>(NG.UploadCode + NG.BoltNumber, NR.NJ));
//                    MesData.Add(new KeyValuePair<string, string>(NG.UploadCode + "JD" + NG.BoltNumber, NR.JD));
//                }
//            }

//            MesResult res1 = MesInterface.MESStationOut(SN, MesData, "*H", "MODE_NONE");
//            if (res1.Success)
//            {
//                dd.SaveLog($"SN={SN}，数据上传成功", true);
//                LoggerServer.LogInfo($"SN={SN}，数据上传成功");
//                ReverseService.RemoveReverseData(SN);
//            }
//            else
//            {
//                dd.SaveLog($"SN={SN}，数据上传失败", true);
//                LoggerServer.LogInfo($"SN={SN}，数据上传失败");
//            }
//        }

//        /// <summary>
//        /// 复位转发
//        /// </summary>
//        private void ResetTransmit()
//        {
//            rateLimiter.Throttle(() =>
//            {
//                if (!frmMain.isTransmit)
//                {
//                    dd.SaveLog("复位了转发", false);
//                    frmMain.isTransmit = true;
//                }
//            });
//        }

//        /// <summary>
//        /// 是否将拧紧数据转发给客户端
//        /// </summary>
//        /// <param name="msg"></param>
//        /// <returns></returns>
//        public bool IsTransferSend(string msg)
//        {
//            bool tig = true;
//            try
//            {
//                if (!string.IsNullOrEmpty(msg) && msg.Length > 180 && msg.Substring(4, 4) == "0061")
//                {
//                    dd.SaveLog("收到抢的回调:" + msg, true);
//                    write("00200062", "");

//                    var setPorgiamID = msg.Substring(90, 3);
//                    //SendId判断当期使用的程序号（反转）
//                    if (frmMain.SendId == setPorgiamID && !frmMain.isTransmit)
//                    {
//                        dd.SaveLog("不发送客户端", true);
//                        tig = false;
//                    }
//                }
//            }
//            catch
//            {
//            }

//            return tig;
//        }
//        public void ConfirmEnable(string ProgramNum)
//        {
//            frmMain.isTransmit = false;
//            SendEnable(true);
//            SendProgram(ProgramNum);
//        }

//        /// <summary>
//        /// 反转逻辑，
//        /// 将反转数据缓存起来
//        /// </summary>
//        private void ReverseFun(string msg)
//        {
//            SendEnable(false);
//            (string result, string rec_angle, string rec_torque) = ConvertThightenData(msg);
//            PackInfo packInfo = pack.GetPackInfo(BaseService.AppConfig.field.StationName);
//            ReverseService.CollectReverseData(packInfo, result, rec_angle, rec_torque);

//            if (frmMain.AutoEnableNumber > 0)
//            {
//                ConfirmEnable(frmMain.AutoEnableProgramNum);
//            }
//            else if (!string.IsNullOrEmpty(LastReceiveCommand))
//            {
//                SendEnable(true);
//                write(LastReceiveCommand);
//                dd.SaveLog($"发一次正转:{LastReceiveCommand}", true);
//                LastReceiveCommand = null;
//                frmMain.isTransmit = true;
//            }
//        }

//        /// <summary>
//        /// 拧紧枪的回调
//        /// </summary>
//        /// <param name="msg"></param>
//        /// <exception cref="Exception"></exception>
//        private void ProcessingResult(string msg)
//        {

//            try
//            {
//                Task.Run(() =>
//                {
//                    if (!string.IsNullOrEmpty(msg) && msg.Length > 180 && msg.Substring(4, 4) == "0061")
//                    {
//                        //write("00200062", "");

//                        (string result, string rec_angle, string rec_torque) = ConvertThightenData(msg);

//                        if (result == "NG")
//                        {
//                            PackInfo packInfo = pack.GetPackInfo(BaseService.AppConfig.field.StationName);
//                            dd.UpdatePackSN(packInfo.SN);
//                        }
//                    }
//                });
//            }
//            catch (Exception ex)
//            {
//                dd.SaveLog("渲染异常:" + ex.Message, true);
//            }
//        }

//        /// <summary>
//        /// 转换拧紧数据
//        /// </summary>
//        /// <param name="msg"></param>
//        /// <returns></returns>
//        private static (string, string, string) ConvertThightenData(string msg)
//        {
//            string result = msg.Substring(107, 1) == "0" ? "NG" : "OK";

//            string rec_torque = (Convert.ToDouble(msg.Substring(142, 5).TrimStart('0')) / 1000f).ToString().Substring(0, 4);
//            string rec_angle = msg.Substring(171, 3).TrimStart('0');
//            dd.SaveLog($"收到回调数据:{result}  {rec_torque}  {rec_angle}", false);
//            dd.UpdateTightenData(result, rec_torque, rec_angle);
//            return (result, rec_angle, rec_torque);
//        }

//        public static void test()
//        {
//            pack.GetPackInfo(BaseService.AppConfig.field.StationName);
//        }

//        public void OnConnected()
//        {
//            write("00200001", "");
//            write("00200042", "");
//            write("00200060", "");
//            write("00209999", "");

//            //keepAliveTM.Start();
//            dd.SaveLog($"连接PCM {IP}:{PORT} + 成功!", true);
//            //this.Invoke(new Action(() =>
//            //{
//            //    string ipClient = _scm._socket.LocalEndPoint.ToString().Split(':')[0];
//            //    string portClient = _scm._socket.LocalEndPoint.ToString().Split(':')[1];
//            //    lb_localIP.Text = ipClient;

//            //    lb_remoteIP.Text = ip;
//            //    lb_remotePort.Text = port.ToString();
//            //    lb_status.Text = "连接正常！";
//            //    ConnectStatus.BackColor = Color.Green;
//            //}));

//        }
//        public void OnFaildConnect()
//        {

//            dd.SaveLog("连接PCM" + ip + " :  失败!", true);
//            // record("连接PCM" + ip + " : " + port + " 失败!", 0);
//            //this.Invoke(new Action(() =>
//            //{
//            //    lb_status.Text = "连接失败";
//            //    ConnectStatus.BackColor = Color.Red;
//            //}));
//        }


//        /// <summary>
//        /// 使能开光
//        /// 
//        /// status = true 给使能
//        /// status = false 断使能
//        /// </summary>
//        /// <param name="status"></param>
//        public void SendEnable(bool status)
//        {
//            if (status)
//            {
//                write("00200043", "");
//            }
//            else
//            {
//                dd.SaveLog("断使能", false);
//                write("00200042", "");
//            }
//        }

//        /// <summary>
//        /// 下发程序号
//        /// </summary>
//        /// <param name="Program"></param>
//        public void SendProgram(string Program)
//        {
//            write("00230018", Program);
//        }
//        public void getshinengZF(byte[] message)
//        {
//            writeZF(message);
//        }

//        private int writeZF(byte[] command)
//        {
//            try
//            {
//                if (_scm == null)
//                {
//                    throw new SocketException(10038);
//                }


//                if (_scm._isConnected)
//                {
//                    _scm.SendMsgZF(command);
//                }

//                return 1;
//            }
//            catch (Exception e)
//            {
//                Console.WriteLine(e.ToString());
//                return 0;
//            }
//        }

//        private int write(string command, string proNo)
//        {
//            try
//            {
//                if (_scm == null)
//                {
//                    throw new SocketException(10038);
//                }

//                string pro = string.IsNullOrEmpty(proNo) ? "" : proNo.PadLeft(3, '0');
//                string text = command.PadRight(20, '0') + pro + "\0";
//                if (_scm._isConnected)
//                    _scm.SendMsg(text);

//                return 1;
//            }
//            catch (Exception e)
//            {
//                Console.WriteLine(e.Message);
//                return 0;
//            }
//        }
//        private int write(string command)
//        {
//            try
//            {
//                if (_scm == null)
//                {
//                    throw new SocketException(10038);
//                }

//                if (_scm._isConnected)
//                    _scm.SendMsg(command);

//                return 1;
//            }
//            catch (Exception e)
//            {
//                Console.WriteLine(e.Message);
//                return 0;
//            }
//        }

//        public void OnConnectErr(string err)
//        {
//            dd.SaveLog("连接PCM11" + ip + " :  失败!", true);
//        }

//        private void keepAlive(object source, ElapsedEventArgs e)
//        {
//            if (_scm._isConnected)
//            {
//                dd.SaveLog("发送心跳！", false);
//                write("00209999", "");
//            }
//            else
//            {
//                _scm = new SocketClient(IP, PORT);
//                _scm.OnReceiveMsg += OnReceiveMsg;
//                _scm.OnConnected += OnConnected;
//                _scm.Start();
//                //ConnectAgain = true;
//                dd.SaveLog("尝试重新连接！", false);
//            }

//            //if (!_scm._isConnected.Equals(reConnect))
//            //{
//            //    if (!_scm._isConnected)
//            //    {
//            //        dd.SaveLog("无线扭力批连接失败！", true);
//            //        //this.Invoke(new Action(() =>
//            //        //{
//            //        //    lb_status.Text = "连接失败";
//            //        //    ConnectStatus.BackColor = Color.Red;
//            //        //}));
//            //    }
//            //    // reConnect = _scm._isConnected;
//            //}
//        }


//    }
//}